/**
 * Оболочка для кнопок с выполнением AJAX-запросов и отображением лоадера
 * @param event событие нажития
 * @param requestParam параметры запроса
 * @param successFunc функция при успешном выполнении
 * @param additionalErrorFunc дополнительная функция при ошибке перед отображением общего блока с текстом ошибки
 * @param additionalCompleteFunc дополнительная функция после выполнения запроса
 */
function loadButtonClick(event, requestParam, successFunc, additionalErrorFunc, additionalCompleteFunc) {
    const btn = event.target.closest('button')
    btn.classList.add('is-loading')
    if (requestParam !== undefined) {
        const contentType = requestParam.contentType || 'application/json';
        $.ajax({
            url: requestParam.path,
            method: requestParam.method,
            contentType: contentType,
            dataType: 'json',
            data: contentType === 'application/json' ? JSON.stringify(requestParam.data) : requestParam.data,
            success: function (data) {
                successFunc(data)
            },
            error: function (response) {
                if (additionalErrorFunc !== undefined) {
                    additionalErrorFunc()
                }
                showError(response)
            },
            complete: function () {
                if (additionalCompleteFunc !== undefined) {
                    additionalCompleteFunc()
                }
                btn.classList.remove('is-loading')
            }
        });
    } else {
        // Заглушка для теста
        successFunc()
    }
}

/**
 * Проверка заполнения обязательных полей формы
 * @param formId идентификатор формы
 * @param excludes наименования полей, исключающихся из проверки
 * @returns {boolean} true - если хотя бы одно поле не прошло проверку, иначе false
 */
function isNotValidForm(formId, excludes) {
    let hasError = false;
    $('form#' + formId + ' input[required]').each(function () {
        if (excludes.includes($(this).attr('name'))) {
            return
        }
        const input = $(this);
        if (!input.val() || isNotValidByRegexp(input)) {
            hasError = true
            input.addClass('is-danger')
        } else if (input.hasClass('is-danger')) {
            input.removeClass('is-danger')
        }
    })
    return hasError
}

/**
 * Проверка значения инпута по регулярному выражению
 * </br>
 * В данный момент проверяется только минимальное количество символов, если указано
 * @param input
 * @returns {boolean} true - если проверка не пройдена иначе false
 */
function isNotValidByRegexp(input) {
    if (!input.attr('minlength')) {
        return false
    }
    const validateRegexp = ".{" + input.attr('minlength') + "}"
    return (input.val().trim().match(validateRegexp) || []).length < 1
}

const sleep = (delay) => new Promise((resolve) => setTimeout(resolve, delay))

/**
 * Отображение общего блока с сообщением об ошибке
 * @param response ответ на запрос
 */
function showError(response) {
    if (response === undefined || !Object.keys(response.responseText).length) {
        showErrorMessage("Непредвиденная ошибка сервиса")
        return
    }
    showErrorMessage(JSON.parse(response.responseText)["message"])
}

/**
 * Отображение общего блока с сообщением об ошибке
 * @param message текст сообщения
 */
function showErrorMessage(message) {
    $('.error-message-container p').text(message)
    $('.error-message-container').removeClass('is-hidden')
    setTimeout(hideErrorMessage, 7000)
}

/**
 * Скрытие общего блока с сообщением об ошибке
 */
function hideErrorMessage() {
    $('.error-message-container').addClass('is-hidden')
    $('.error-message-container p').text('')
}

$(function () {
    const body = $('body');

    body.on('click', '.error-message-container .delete', function () {
        hideErrorMessage()
    });

    /*
    Начало списка функций для модальных окон
     */
    function openModal($el) {
        $el.classList.add('is-active');
    }

    function closeModal($el) {
        $el.classList.remove('is-active');
    }

    body.on('click', '.js-modal-trigger', function (event) {
        const trigger = event.target.closest('.js-modal-trigger');
        trigger.classList.add('is-loading');

        const modalId = trigger.dataset.target;
        const modalContainerId = trigger.dataset.container;
        const loadDataUrl = trigger.dataset.url;

        $('#' + modalContainerId).load(loadDataUrl, function () {
            openModal(document.getElementById(modalId));
            trigger.classList.remove('is-loading');
        });
    });
    body.on('click', '.modal-background, .modal-close, .modal-card-head .delete, .modal-card-foot .button.close', function (event) {
        closeModal(event.target.closest('.modal'))
    });
    /*
    Конец списка функций для модальных окон
     */

    body.on('click', '.pagination-link', function (event) {
        if (event.target.classList.contains('is-current')) {
            return
        }
        let page = event.target.dataset.page;
        const pagination = event.target.closest('.pagination');
        let search = pagination.dataset.search;
        let searchValue = search !== undefined ? search : ''
        $(pagination.dataset.reloadContainer).load(pagination.dataset.reloadUrl + "?page=" + page + (searchValue.length > 0 ? '&username=' + searchValue : ''))
    });
})